package persistencia;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import outros.Conexao;
import outros.Util;
import transporte.TOUsuario;

public class DAOUsuario {
    private Conexao conexao = new Conexao();
    private Connection con = null;
    private Util util = new Util();

    public boolean abrirConexao() {
        UIManager.put("OptionPane.yesButtonText", "Sim");
        UIManager.put("OptionPane.noButtonText", "Não");
        UIManager.put("OptionPane.cancelButtonText", "Cancelar");
        try {
            conexao.abrirConexao();
            con = conexao.getConexao();
            return true;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao tentar conectar ao banco de dados.");
            return false;
        }
    }

    public String criar(TOUsuario usuario) {
        PreparedStatement ps = null;
        String sql = "INSERT INTO patri_usuario VALUES(?,?,?,?,?)";
        int id = -1;
        try {
            id = getProximo("patri_usuario");
            if (id!=-1) {
                abrirConexao();
                ps = con.prepareStatement(sql);
                ps.setString(1, usuario.getNome());
                ps.setString(2, usuario.getSenha());
                ps.setInt(3, usuario.getNivel());
                ps.setInt(4, id);
                ps.setString(5, "ativo");
                ps.execute();
                con.commit();
                conexao.fecharConexao();
                return "";
            } else {
                conexao.fecharConexao();
                JOptionPane.showMessageDialog(null, "Erro ao tentar atribuir novo ID.");
                return "erro";
            }
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar inserir dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    public TOUsuario logar(String nome, String senha) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        sql = "SELECT * FROM patri_usuario WHERE nome='"+nome+"' AND senha='"+senha+"' AND status='ativo'";
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            TOUsuario to;
            if (rs.first()) {
                to = new TOUsuario();
                to.setNivel(rs.getInt("nivel"));
                to.setNome(rs.getString("nome"));
                to.setSenha(rs.getString("senha"));
                to.setNumero(rs.getInt("numero"));
                criarRegistro(to, "Efetuou login.");
                return to;
            }
            conexao.fecharConexao();
            return null;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar logar. Detalhes: "+e.toString());
            return null;
        }
    }

    public TOUsuario selecionarRegistro(String id) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        sql = "SELECT * FROM patri_usuario WHERE nome='"+id+"'";
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            TOUsuario to;
            if (rs.first()) {
                to = new TOUsuario();
                to.setNivel(rs.getInt("nivel"));
                to.setNome(rs.getString("nome"));
                to.setSenha(rs.getString("senha"));
                to.setStatus(rs.getString("status"));
                return to;
            }
            conexao.fecharConexao();
            return null;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar dados. Detalhes: "+e.toString());
            return null;
        }
    }

    public ArrayList<TOUsuario> selecionar(String busca) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        if (busca.length()==0) {
            sql = "SELECT * FROM patri_usuario ORDER BY nome ASC";
        } else {
            sql = "SELECT * FROM patri_usuario WHERE sem_acento(nome) ILIKE '%"+busca+"%' ORDER BY nome ASC";
        }
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            ArrayList<TOUsuario> al = new ArrayList();
            TOUsuario to = null;
            while (rs.next()) {
                to = new TOUsuario();
                to.setNivel(rs.getInt("nivel"));
                to.setNome(rs.getString("nome"));
                to.setSenha(rs.getString("senha"));
                to.setNumero(rs.getInt("numero"));
                to.setStatus(rs.getString("status"));
                al.add(to);
            }
            return al;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar dados. Detalhes: "+e.toString());
            return null;
        }
    }

    public String excluir(int numero) {
        PreparedStatement ps = null;
        String sql = "DELETE FROM patri_usuario WHERE nome=?";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            ps.setInt(1, numero);
            ps.execute();
            conexao.fecharConexao();
            return "";
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar excluír dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    public String alterar(TOUsuario usuario) {
        PreparedStatement ps = null;
        String sql = "UPDATE patri_usuario SET senha=?, nivel=?, status=? WHERE nome=?";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            ps.setString(1, usuario.getSenha());
            ps.setInt(2, usuario.getNivel());
            ps.setString(3, usuario.getStatus());
            ps.setString(4, usuario.getNome());
            ps.execute();
            con.commit();
            conexao.fecharConexao();
            return "";
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar alterar dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    public void criarRegistro(TOUsuario usuario, String tipo) {
        abrirConexao();
        int id = 0;
        try {
            id = getProximo("patri_reg_usuario");
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar atribuir ID do registro de login.");
            return;
        }
        PreparedStatement ps = null;
        String sql = "INSERT INTO patri_reg_usuario VALUES(?,?,?,?,?,?)";
        try {
            ps = con.prepareStatement(sql);
            ps.setInt(1, id);
            ps.setInt(2, usuario.getNumero());
            ps.setString(3, usuario.getNome());
            ps.setString(4, util.getHora());
            ps.setDate(5, new java.sql.Date(util.getData().getTime()));
            ps.setString(6, tipo);
            ps.execute();
            con.commit();
            conexao.fecharConexao();
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar inserir registro de login. Detalhes: "+e.toString());
        }
    }

    private int getProximo(String tabela){
        String sql = "SELECT MAX(numero) FROM "+tabela;
        try {
            Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet rs = st.executeQuery(sql);
            if (rs.first()){
                return rs.getInt(1)+1;
            } else {
                return -1;
            }
        } catch (Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            return -1;
        }
    }
}
